﻿using System.Configuration;


/***
 * 这段代码定义了一个名为`RepositoryMappingCollection`的密封类，该类继承自`ConfigurationElementCollection`。
 * 它是专门为处理配置文件中一组具有相同结构的配置元素而设计的，特别适用于管理仓库映射的集合。以下是各个部分的详细解释：
 * 
 * 1. 密封类（`sealed`）: 表明该类不能被继承，保证了它的实现细节不会被外部修改。
 * 
 * 2. `CreateNewElement`方法: 重写自`ConfigurationElementCollection`，用于在向集合中添加新元素时
 *    创建一个新的`ConfigurationElement`实例。 这里返回的是`RepositoryMappingElement`类型的实例，
 *    表明每个集合项都是一个仓库映射元素。
 *    
 * 3. `GetElementKey`方法: 用于定义集合中每个元素的唯一键。这里使用`InterfaceShortTypeName`属性作为键，
 *    意味着每个仓库映射是根据其接口的简短类型名称来区分的。   
 * 
 * 4. `CollectionType`属性: 指定了集合的类型，这里是`ConfigurationElementCollectionType.BasicMap`，表
 *    明它是一个基本的键值对映射集合。
 *    
 * 5. `ElementName`属性: 返回配置元素在配置文件中的标签名称，这里使用的是
 *    `RepositoryMappingConstants.ConfigurationElementName`，具体名称需在常量定义中查找。
 * 
 * 6. 索引器（Indexer）: 提供了通过索引访问集合元素的能力。允许通过索引获取或设置`RepositoryMappingElement`对象，
 *    同时在设置时会先移除原位置的元素再添加新的元素。
 * 
 * 7. 第二个索引器（Key-based Indexer）: 提供了通过`interfaceShortTypeName`作为键来访问集合元素的能力，简化了根
 *    据特定键获取元素的逻辑。
 * 
 * 8. `ConstaintsKey`方法: 它检查集合中是否存在指定的键（`interfaceShortTypeName`）， 通过遍历所有键并比较来实现，
 *    最后返回布尔值表示结果。
 * 
 * 总结而言，`RepositoryMappingCollection`类是用来管理配置文件中仓库映射配置元素的集合类，它负责创建、访问和管理这些元素，
 * 特别是通过特定的键（接口简短类型名称）来组织和检索元素，是配置系统中处理复杂配置数据结构的重要组成部分。
 */

namespace SmartCA.Infrastructure.RepositoryFramework.Configuration
{
    /// <summary>
    /// 处理配置文件类: 元素集合类
    /// </summary>
    public sealed class RepositoryMappingCollection : ConfigurationElementCollection
    {
        
        protected override ConfigurationElement CreateNewElement()
        {
            return new RepositoryMappingElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((RepositoryMappingElement)element).InterfaceShortTypeName;
        }

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
        }

        protected override string ElementName
        {
            get
            {
                return RepositoryMappingConstants.ConfigurationElementName;
            }
        }

        public RepositoryMappingElement this[int index]
        {
            get { return (RepositoryMappingElement)this.BaseGet(index); }
            set
            {
                if (this.BaseGet(index) != null)
                {
                    this.BaseRemoveAt(index);
                }
                this.BaseAdd(index, value);
            }
        }

        public new RepositoryMappingElement this[string interfaceShortTypeName]
        {
            get { return (RepositoryMappingElement)this.BaseGet(interfaceShortTypeName); }
        }

        public bool ContaintsKey(string keyName)
        {
            bool result = false;
            object[] keys = this.BaseGetAllKeys();
            foreach (object key in keys)
            {
                if ((string)key == keyName)
                {
                    result = true;
                    break;
                }
            }
            return result;
        }

    }
}
